MapStruct হল একটি Java-ভিত্তিক কোড জেনারেটর যা DTO (Data Transfer Object) এবং ডোমেইন অবজেক্টের মধ্যে ম্যাপিং বা ডেটা কনভার্শন সহজ করে তোলে। এটি compile-time কোড জেনারেট করে এবং no reflection ব্যবহার করে, যার ফলে পারফরম্যান্স দ্রুত থাকে। এর মধ্যে একটি গুরুত্বপূর্ণ ফিচার হল Update Method, যা একটি অবজেক্টের কিছু ফিল্ডকে আপডেট করতে ব্যবহৃত হয়, বিশেষত Partial Mapping বা Partial Update এর জন্য। এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে আপনি পুরো অবজেক্টটি নতুনভাবে ম্যাপ না করে, শুধুমাত্র নির্দিষ্ট কিছু ফিল্ডকে আপডেট করতে চান।
এটি সাধারণত DTO এর মানগুলি Entity তে আপডেট করার জন্য ব্যবহৃত হয়, বিশেষত যখন Entity এর বেশ কিছু ফিল্ড অপরিবর্তিত থাকে।
১. Update Method এর ধারণা
Update Method হল একটি ম্যাপিং ফাংশন যা এক অবজেক্টের কিছু মান অন্য অবজেক্টের সাথে আপডেট করে। এটি সাধারণত DTO (Data Transfer Object) থেকে ডেটা গ্রহণ করে এবং সংশ্লিষ্ট Entity (বা ডোমেইন অবজেক্ট) আপডেট করতে ব্যবহৃত হয়।
ধরা যাক, আমাদের দুটি অবজেক্ট রয়েছে:
- PersonDTO: যার মধ্যে নতুন তথ্য আসবে।
- Person: যে অবজেক্টে আপডেট করতে হবে।
ম্যাপস্ট্রাক্ট আপনাকে এ দুটি অবজেক্টের মধ্যে কাস্টম update ফাংশন তৈরি করতে সহায়তা করে। এর মাধ্যমে আপনি কিছু নির্দিষ্ট ফিল্ড আপডেট করতে পারেন।
২. Update Method এর প্রয়োজনীয়তা
Update Method ব্যবহারের কিছু গুরুত্বপূর্ণ সুবিধা হল:
- Partial Mapping: কখনও কখনও আপনাকে পুরো অবজেক্ট ম্যাপিং না করে শুধুমাত্র কিছু নির্দিষ্ট ফিল্ড আপডেট করতে হতে পারে। এ ক্ষেত্রে Update Method খুবই সহায়ক।
- Performance Improvement: আপনি পুরো অবজেক্ট ম্যাপিং না করে শুধু দরকারি ফিল্ড আপডেট করলে পারফরম্যান্সে উন্নতি আসে, বিশেষ করে বড় ডেটাসেটে।
- Reduced Overhead: শুধু পরিবর্তিত ফিল্ডগুলো আপডেট করলে কোডের জটিলতা কমে এবং একাধিক ফিল্ডের আপডেটের প্রয়োজনীয়তা কমে।
৩. Update Method Example
Scenario:
ধরা যাক, আমাদের একটি PersonDTO এবং Person অবজেক্ট রয়েছে, এবং আমরা শুধুমাত্র PersonDTO থেকে Person অবজেক্টের কিছু ফিল্ড আপডেট করতে চাই, যেমন name এবং age।
PersonDTO.java (DTO)
public class PersonDTO {
private String name;
private int age;
// Getters and Setters
}
Person.java (Entity)
public class Person {
private String name;
private int age;
private String address;
// Getters and Setters
}
PersonMapper.java (Update Method)
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
@Mapper
public interface PersonMapper {
// Mapping from PersonDTO to Person and updating only specific fields
void updatePersonFromDTO(PersonDTO personDTO, @MappingTarget Person person);
}
এখানে, updatePersonFromDTO মেথডটি PersonDTO থেকে Person অবজেক্টে শুধু name এবং age ফিল্ডগুলো আপডেট করবে, এবং address ফিল্ডটি অপরিবর্তিত থাকবে।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
// Original Person entity
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setAddress("New York");
// New data from PersonDTO
PersonDTO personDTO = new PersonDTO();
personDTO.setName("Mike");
personDTO.setAge(35);
// Update Person entity using MapStruct
PersonMapper.INSTANCE.updatePersonFromDTO(personDTO, person);
// Printing updated person
System.out.println("Updated Name: " + person.getName());
System.out.println("Updated Age: " + person.getAge());
System.out.println("Unchanged Address: " + person.getAddress());
}
}
এখানে, updatePersonFromDTO মেথডের মাধ্যমে PersonDTO থেকে Person অবজেক্টের name এবং age ফিল্ডগুলো আপডেট হচ্ছে, কিন্তু address ফিল্ড অপরিবর্তিত থাকে।
Output:
Updated Name: Mike
Updated Age: 35
Unchanged Address: New York
৪. Update Method এর সাথে Custom Logic ব্যবহার
কখনও কখনও আপনি custom mapping logic প্রয়োগ করতে চাইবেন। MapStruct আপনাকে কাস্টম কনভার্সন লজিক ব্যবহারের সুযোগ দেয়।
Custom Mapping Example
ধরা যাক, age ফিল্ডে কিছু কাস্টম লজিক প্রয়োগ করতে হবে, যেমন যদি age এর মান 0 থাকে তবে সেটি null করা হবে।
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "age", source = "age")
void updatePersonFromDTO(PersonDTO personDTO, @MappingTarget Person person);
@AfterMapping
default void checkAge(PersonDTO personDTO, @MappingTarget Person person) {
if (personDTO.getAge() == 0) {
person.setAge(null); // Custom logic to set age as null if 0
}
}
}
এখানে, @AfterMapping অ্যানোটেশন ব্যবহার করে কাস্টম লজিক প্রয়োগ করা হয়েছে, যা age ফিল্ডে যদি 0 থাকে তবে সেটি null করে।
৫. Summary
MapStruct Update Method একটি শক্তিশালী ফিচার যা Partial Mapping বা Partial Update বাস্তবায়ন করতে সাহায্য করে। এটি আপনাকে শুধু প্রয়োজনীয় ডেটা ফিল্ডগুলো আপডেট করতে দেয়, যাতে পুরো অবজেক্টটি রিফ্রেশ না করতে হয়। MapStruct এর মাধ্যমে DTO থেকে Entity বা Entity থেকে DTO তে কেবল নির্দিষ্ট ফিল্ড আপডেট করা সম্ভব হয়, যা পারফরম্যান্স এবং কোড সিম্পলিফিকেশনে সহায়তা করে। কাস্টম লজিক প্রয়োগের মাধ্যমে আরও নির্দিষ্ট এবং জটিল ম্যাপিংও করা যেতে পারে।